/**
	********************************************************************************
	*
	*文件名称：
	*
	*文件日期：
	*
	*文件描述：
	*
	*文件版本：
	*
	*修改历史：
	*
	********************************************************************************
***/

/*******************************	头文件包含区	**********************************/
#include "icm40608.h"
#include "math.h"
/******************************* 全局变量定义区 **********************************/
void check_lowU_temp(void);


/**
	*********************************************************************************
	*
	*函数名称：
	*
	*函数参数：无
	*
	*函数返回值：无
	*
	*功能描述：
	*
	*********************************************************************************
**/

void bl0939_send(void)
{
	static uint8_t time_cnt = 0;
	uint8_t buf5[2] = {0x55, 0xAA};
//	uint8_t buf6[2] = {0x55, 0x0C};
	reg.R.p1_factor = 1;
	reg.R.v_hz = 50;
//	reg.R.f
	time_cnt++;
	if(time_cnt >= 100)
	{
		my_usart_send_data2(buf5, 2);
		time_cnt = 0;
	}
	else if(time_cnt >= 150)
	{
	//	my_usart_send_data2(buf6, 2);
		time_cnt = 0;
	}
}


uint32_t cos_reg = 0;
void bl0939_data_recive(uint8_t *buf)
{
	uint8_t check_sum = 0x55, i;
	double temp_value = 0;
	uint32_t temp_reg;
	uint32_t im;
//	static uint8_t p1_cnt = 0;
	
	
	//LOGD("buf1:0x%x,buf2:0x%x,buf3:0x%x,buf4:0x%x\r\n", buf[0],buf[1],buf[2],buf[3]); 
	if(m_uart2.rx_len > 20)
	{
		for(i = 0; i < 34; i++)
		check_sum += buf[i];
		check_sum = ~check_sum;
	
		if(check_sum != buf[34])
		return;
	
		temp_reg = buf[12] << 16 | buf[11] << 8 | buf[10] << 0;
		temp_value = (temp_reg * 1.218 * (150 * 3 + (float)1.18)) / (79931 * (float)1.18 * 10) - 19;
	
		if(temp_value > 0)
			reg.R.v = temp_value ;
		else 
			reg.R.v = 0;
	
		temp_reg = buf[3] << 16 | buf[2] << 8;
		reg.R.leak_i = temp_reg / 500;
		//LOGD("temp_reg:%d\r\n", temp_reg); 
	
		temp_reg = buf[6] << 16 | buf[5] << 8 | buf[4] << 0;
		im = temp_reg * 1218 / (324004);
	
		if(im < 100)
			im += 40;
		else if(im > 100 && im < 200)
			im += 14;
		im += 20;
	//LOGD("I:%dmA reg_data:0x%x\r\n", im,temp_reg); 
		reg.R.i1 = im;
	
		temp_reg = buf[18] << 16 | buf[17] << 8 | buf[16] << 0;
		temp_value = (temp_reg * 0.00141105) + 0.6;
		reg.R.p1 =  temp_value;
		if(temp_reg > 0xf00000)
			reg.R.p1 = 0;

		temp_reg = buf[24] << 16 | buf[23] << 8 | buf[22] << 0;
	//reg.R.e1 = temp_reg;
//  reg.R.e1 = (uint32_t)&energy;
//	U32_PLUS(reg.R.e1);
		reg.R.e1 = swapUint32_t(reg.R.e1);
		temp_value = (1.96 / 1200) * temp_reg;
		reg.R.e1 =  device_info.e1 + temp_value;
		reg.R.e1 = swapUint32_t(reg.R.e1);
//	LOGD("temp_value:%.1f temp_reg=%d\r\n", temp_value,temp_reg); 
	
		temp_reg =  buf[29] * 256 +  buf[28];
		temp_value = ((0.379) * (temp_reg / 2 - 32)) - 45;
		reg.R.temp = temp_value * 10;
		
	}

	check_lowU_temp();
}



void check_lowU_temp(void)
{
	static u8 alarm = 0, last_light;
	
	if(reg.W.moso_alarm_pwm == 100)
		return;
	
	if((reg.R.alarm.Temp_bit || (reg.R.v < 900 && reg.R.v > 500)) && alarm == 0)
	{
		alarm = 1;
		last_light = reg.RW.lamp[0].light;
		if(reg.W.moso_alarm_pwm < 10 || reg.W.moso_alarm_pwm > 100)
			reg.W.moso_alarm_pwm = 60;
		reg.RW.lamp[0].light = (reg.RW.lamp[0].light * reg.W.moso_alarm_pwm) / 100;
		if(reg.RW.lamp[0].light < 10)
			reg.RW.lamp[0].sw = 0;
		last_light = reg.RW.lamp[0].light;
	}
	if((reg.R.alarm.Temp_bit || (reg.R.v < 900 && reg.R.v > 500)) && alarm == 1)
	{
		reg.RW.lamp[0].light = last_light;
	}
	else
	{
		alarm = 0;
	}
}



void check_max_power(void)
{
//	static uint16_t time_cnt = 0, init_pwm;
//	static uint8_t init_sw, init_light, status = 0;
//	
//	if(reg.RW.moso_check == 0)
//	{
//		return;
//	}

//	time_cnt++;
//	
//	switch(status)
//	{
//		case 0:
//			init_pwm = reg.R.moso_max_light;
//			init_sw = reg.RW.lamp[0].sw;
//			init_light = reg.RW.lamp[0].light;
//			reg.R.moso_max_light = 100;
//			reg.RW.lamp[0].sw = 1;
//			reg.RW.lamp[0].light = 10;
//			status = 1;
//			time_cnt = 0;
//			break;
//		case 1:
//			if(time_cnt > 300)
//			{
//				time_cnt = 0;
//				if(reg.R.p1 < 165 && reg.RW.lamp[0].light != 100)
//					reg.RW.lamp[0].light++;
//				else
//				{
//					reg.R.moso_max_light = reg.RW.lamp[0].light;
//					reg.RW.lamp[0].sw = init_sw;
//					reg.RW.moso_check = 0;
//					status = 0;
//					reg.RW.lamp[0].light = init_light;
//					data_flash_write();
//				}
//			}
//			break;
//	}
}

